package com.hy.service.impl;

import com.aliyuncs.exceptions.ClientException;
import com.hy.config.note.PhoneConfig;
import com.hy.config.note.SendMessageService;
import com.hy.service.NoteService;
import com.hy.utils.HY_Result;
import com.hy.utils.ResultCode;
import com.hy.utils.note.MsgCode;
import com.hy.utils.redis.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * 短信 - 服务
 * @Author: 是奕靜吖
 */
@Service
public class NoteServiceImpl implements NoteService {

    //获取redis
    @Autowired
    private RedisUtil red;

    //引入验证码配置类
    @Resource
    private PhoneConfig phoneConfig;

    //引入通用类型的redis模板 直接注入即可
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 发送短信 - 奕靜
     * @param phone
     * @return
     */
    @Override
    public HY_Result sendCode(String phone) throws ClientException {
        //接收 短信 信息
        HY_Result rs = SendMessageService.sendSms(phone);
        if (rs.isSuccess()){
            //存储到redis-五分钟
            redisTemplate.opsForValue().set(phone,rs.getData(),5L, TimeUnit.MINUTES);
            //短信发送成功
            return HY_Result.SUCCESS();
        }
        //短信发送失败
        return rs;
    }

    /**
     * 发送验证码 - 华子
     * @param phone
     * @return
     */
    @Override
    public HY_Result sendSms(String phone) {
        //生成验证码
        String msgCode = MsgCode.getMsgCode();
        String code = "{\"code\":\"" + msgCode + "\"}";
        if (phoneConfig.send(phone, "SMS_205821494", code)){
            //保存至redis5分钟
            redisTemplate.opsForValue().set(phone, msgCode, 5, TimeUnit.MINUTES);
            //验证码发送成功
            return HY_Result.SUCCESS();
        }
        //验证码发送失败
        return HY_Result.FAILURE();
    }

    /**
     * 检查验证码
     * @param phone
     * @param code
     * @return
     */
    @Override
    public HY_Result checkVerification(String phone,String code){
        //缓存中验证手机号
        if (red.exists(phone)){
            return red.get(phone).toString().equals(code) ? new HY_Result(ResultCode.SUCCESS,null, "https://www.baidu.com/") : HY_Result.VERIFICATION_ERROR();
        }
        //手机号对应验证码不存在
        return HY_Result.VERIFICATION_OVERDUE();
    }
}
